package main

import "fmt"

func main() {
	// 使用 &变量名 取 变量地址
	// 使用 *指针变量 取 对应 值
	n := 100
	p := &n
	fmt.Printf("n => %T %d\n", n, n)
	fmt.Printf("p => %T %p\n", p, p)
	fmt.Printf("*p => %T %d\n", *p, *p)

	fmt.Println("=========================================================")

	// 这种方式创建的变量为未初始化的 nil (空)指针 如果 直接对其进行赋值操作 将引发异常
	var pi *int
	fmt.Printf("pi => %T %v\n", pi, pi)
	// 正确方式
	// 通过 new 获取 对应类型 的 零值 指针
	// new 一般用于 给 基本数据 类型 申请内存 如: string, int, byte 等
	// make 用于 为 slice, map, chan 申请内存
	pi = new(int)
	*pi = 100
	fmt.Printf("pi => %T %p\n", pi, pi)
	fmt.Printf("*pi => %T %d\n", *pi, *pi)

}
